<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="SnpjA" id="SnpjA"><span data-lake-id="ubd65951b" id="ubd65951b">典型回答</span></h1>
  <p data-lake-id="ue703f53c" id="ue703f53c"><br></p>
  <p data-lake-id="u4d9af514" id="u4d9af514"><strong><span data-lake-id="u1b93a2f2" id="u1b93a2f2">状态模式允许一个对象在其内部状态发生改变时改变它的行为，使其看起来像是修改了其类。</span></strong><span data-lake-id="u842fc448" id="u842fc448">它通过将对象的行为包装在不同状态对象中，实现了在运行时更改对象的状态，从而影响其行为。</span></p>
  <p data-lake-id="u9d01bf60" id="u9d01bf60"><br></p>
  <p data-lake-id="u942b7f3a" id="u942b7f3a"><span data-lake-id="ue22c2d68" id="ue22c2d68">状态模式也有很多实际的应用场景，如：</span></p>
  <p data-lake-id="u9642a50d" id="u9642a50d"><br></p>
  <ol list="u72595d86">
   <li fid="ud693d06a" data-lake-id="u921172a8" id="u921172a8"><span data-lake-id="u505a97a6" id="u505a97a6">订单状态管理：订单状态有很多种，如未付款、已付款、已发货、已签收等。不同状态下，订单的行为也不同。</span></li>
   <li fid="ud693d06a" data-lake-id="ue9c151ce" id="ue9c151ce"><span data-lake-id="uc73dd7c7" id="uc73dd7c7">游戏角色状态：游戏角色的状态有很多种，如待机、行走、攻击、受伤等。不同状态下，角色的行为也不同。</span></li>
   <li fid="ud693d06a" data-lake-id="ub8642772" id="ub8642772"><span data-lake-id="uff16de77" id="uff16de77">音视频播放器：音视频播放器的状态有很多种，如播放、暂停、停止、快进、快退等。不同状态下，播放器的行为也不同。</span></li>
  </ol>
  <p data-lake-id="u17c73631" id="u17c73631"><span data-lake-id="u129d5a97" id="u129d5a97">​</span><br></p>
  <p data-lake-id="u9d333f08" id="u9d333f08"><span data-lake-id="ue86d131d" id="ue86d131d">在实际应用中，状态模式通常需要和其他设计模式结合使用，例如工厂模式、单例模式、策略模式等，以实现更灵活和高效的代码设计。</span></p>
  <p data-lake-id="u49499b93" id="u49499b93"><span data-lake-id="u17bef6ea" id="u17bef6ea">​</span><br></p>
  <h1 data-lake-id="y6C4d" id="y6C4d"><span data-lake-id="ua4323b81" id="ua4323b81">扩展知识</span></h1>
  <h2 data-lake-id="X3YMa" id="X3YMa"><span data-lake-id="u4eeba5ae" id="u4eeba5ae">示例</span></h2>
  <p data-lake-id="u422ac161" id="u422ac161"><br></p>
  <p data-lake-id="ub7f4e529" id="ub7f4e529"><span data-lake-id="ubcb93cde" id="ubcb93cde">假设我们正在为一个在线投票系统设计程序。每个用户都可以投票，但投票规则因用户的状态而异，如下：</span></p>
  <p data-lake-id="ue79fbf3f" id="ue79fbf3f"><span data-lake-id="ue9609cc6" id="ue9609cc6">​</span><br></p>
  <ul list="uc5e2873c">
   <li fid="u28d6ac6f" data-lake-id="uac4a9dc8" id="uac4a9dc8"><span data-lake-id="ue805f5cf" id="ue805f5cf">如果用户是新用户，那么只能投一票。</span></li>
   <li fid="u28d6ac6f" data-lake-id="uefc737e3" id="uefc737e3"><span data-lake-id="u45312e22" id="u45312e22">如果用户是中级用户，那么可以投 2 票。</span></li>
   <li fid="u28d6ac6f" data-lake-id="u2dd656e3" id="u2dd656e3"><span data-lake-id="uf89a6a3a" id="uf89a6a3a">如果用户是高级用户，那么可以投 5 票。</span></li>
  </ul>
  <p data-lake-id="ud1eaa95a" id="ud1eaa95a"><br></p>
  <p data-lake-id="uc322e9d4" id="uc322e9d4"><span data-lake-id="ub7af8509" id="ub7af8509">首先定义一个状态接口，包含两个方法：投票和获取用户状态。</span></p>
  <p data-lake-id="u667ce6cb" id="u667ce6cb"><span data-lake-id="ub8577a04" id="ub8577a04">​</span><br></p>
  <pre lang="java"><code>
//状态接口
public interface UserState {
    void vote(User user);
    String getStateName();
}
</code></pre>
  <p data-lake-id="u4e10f0d7" id="u4e10f0d7"><br></p>
  <p data-lake-id="uee22a8ab" id="uee22a8ab"><span data-lake-id="ue136af2d" id="ue136af2d">然后定义三个具体的状态类，分别是新用户状态、中级用户状态和高级用户状态，实现投票和获取用户状态方法。</span></p>
  <p data-lake-id="ucbc1c272" id="ucbc1c272"><span data-lake-id="u09d94849" id="u09d94849">​</span><br></p>
  <pre lang="java"><code>
//新用户状态类
public class NewUserState implements UserState {
    public void vote(User user) {
        user.setVoteCount(1);
        user.setState(new MiddleUserState());
    }

    public String getStateName() {
        return "新用户";
    }
}

//中级用户状态类
public class MiddleUserState implements UserState {
    public void vote(User user) {
        int count = user.getVoteCount();
        if (count &lt; 2) {
            user.setVoteCount(count + 1);
        } else {
            user.setState(new HighUserState());
            user.setVoteCount(count + 1);
        }
    }

    public String getStateName() {
        return "中级用户";
    }
}

//高级用户状态类
public class HighUserState implements UserState {
    public void vote(User user) {
        int count = user.getVoteCount();
        if (count &lt; 5) {
            user.setVoteCount(count + 1);
        } else {
            System.out.println("您已经投过 5 票，不能再投了！");
        }
    }

    public String getStateName() {
        return "高级用户";
    }
}
</code></pre>
  <p data-lake-id="u7133ba92" id="u7133ba92"><span data-lake-id="u90072261" id="u90072261">​</span><br></p>
  <p data-lake-id="uf7717710" id="uf7717710"><span data-lake-id="u7c57a5e0" id="u7c57a5e0">最后定义一个用户类，包含状态接口的实例和投票次数。每次投票时，用户会调用自己的投票方法，该方法会调用状态对象的投票方法。</span></p>
  <p data-lake-id="u60e891e3" id="u60e891e3"><span data-lake-id="ubebb8d80" id="ubebb8d80">​</span><br></p>
  <pre lang="java"><code>
//用户类
public class User {
    private UserState state;
    private int voteCount;

    public User() {
        this.state = new NewUserState();
    }

    public void vote() {
        state.vote(this);
    }

    public void setState(UserState state) {
        this.state = state;
    }

    public void setVoteCount(int count) {
        this.voteCount = count;
    }

    public int getVoteCount() {
        return this.voteCount;
    }

    public String getStateName() {
        return state.getStateName();
    }
}
</code></pre>
  <p data-lake-id="uc1a7121e" id="uc1a7121e"><br></p>
  <p data-lake-id="u35d4d2db" id="u35d4d2db"><span data-lake-id="u44d16f00" id="u44d16f00">在上面的示例中，我们定义了三个具体状态类，分别是 NewUserState、MiddleUserState 和 HighUserState，每个状态类实现了投票方法。</span></p>
  <p data-lake-id="u45e4857d" id="u45e4857d"><span data-lake-id="udc59769d" id="udc59769d">​</span><br></p>
  <pre lang="java"><code>

public class Test {

	public staic void main(String []args){
  	User user = new User();
  	
  	UserState middleUserState = new MiddleUserState();
  	user.setState(middleUserState);

  	user.vote();
  }
}
</code></pre>
  <p data-lake-id="u1bfa663f" id="u1bfa663f"><span data-lake-id="u5d26930a" id="u5d26930a">​</span><br></p>
  <p data-lake-id="udc63f970" id="udc63f970"><span data-lake-id="u3db3791f" id="u3db3791f">​</span><br></p>
  <p data-lake-id="u5465ab8f" id="u5465ab8f"><span data-lake-id="u473eee6f" id="u473eee6f">在 User 类中，定义了状态接口实例和投票次数，每次投票时，用户会调用自己的投票方法，该方法会调用状态对象的投票方法。状态对象可以根据用户的投票次数，决定用户的状态，并改变用户状态。</span></p>
 </body>
</html>